import numpy as np

a = np.array([1, 2, 3])
b = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
b[1,1]=10

##通过函数 shape 属性获得数组的大小，通过 dtype获得元素的属性。
print(a.shape)
print(b.shape)
print(a.dtype)
print(b)

print ("==================================================================")
persontype = np.dtype(
    {'names':['name','age', 'chinese', 'math', 'english'],
     'formats':['S32','i','i', 'i', 'f']
     }
)
peoples = np.array([("ZhangFei",32,75,100, 90),("GuanYu",24,85,96,88.5),
                    ("ZhaoYun",28,85,92,96.5),("HuangZhong",29,65,85,100)],
                   dtype=persontype)

ages = peoples[:]['age']
chineses = peoples[:]['chinese']
maths = peoples[:]['math']
englishs = peoples[:]['english']
print (np.mean(ages))
print (np.mean(chineses))
print (np.mean(maths))
print (np.mean(englishs))

print ("==================================================================")
# 将矩阵中的每一列按照从小到大的方式进行排序。
# axis=0 代表跨行（实际上就是按列），axis=1 代表跨列（实际上就是按行）
a = np.array([[4,3,2],[2,4,1]])
print (np.sort(a, axis=0))


print ("==================================================================")
# np.arange 和 np.linspace 起到的作用是一样的，都是创建等差数组。这两个数组的结果x1,x2
# 都是 [1 3 5 7 9]。结果相同，但是你能看出来创建的方式是不同的。
x1 = np.arange(1,11,2)
x2 = np.linspace(1,9,5)
print (x1)
print (x2)
#  通过 NumPy 可以自由地创建等差数组，同时也可以进行加、减、乘、除、求 n 次方和取余数。
print (np.add(x1, x2))
print (np.subtract(x1, x2))
print (np.multiply(x1, x2))
print (np.divide(x1, x2))
print (np.power(x1, x2))
print (np.remainder(x1, x2))
print ("==================================================================")


# 计数组 / 矩阵中的最大值函数 amax()，最小值函数 amin()

# amin() 用于计算数组中的元素沿指定轴的最小值。对于一个二维数组 a，amin(a) 指的是
# 数组中全部元素的最小值，amin(a,0) 是延着 axis=0 轴的最小值，axis=0 轴是把元素看成
# 了 [1,4,7], [2,5,8], [3,6,9] 三个元素，所以最小值为 [1,2,3]，amin(a,1) 是延着 axis=1 轴
# 的最小值，axis=1 轴是把元素看成了 [1,2,3], [4,5,6], [7,8,9] 三个元素，所以最小值为
# [1,4,7]。同理 amax() 是计算数组中元素沿指定轴的最大值。

a = np.array([[1,2,3], [4,5,6], [7,8,9]])
print (np.amin(a))
print (np.amin(a,0))
print (np.amin(a,1))
print (np.amax(a))
print (np.amax(a,0))
print (np.amax(a,1))
print ("==================================================================")
#  统计最大值与最小值之差 ptp()

# 对于相同的数组 a，np.ptp(a) 可以统计数组中最大值与最小值的差，即 9-1=8。同样
# ptp(a,0) 统计的是沿着 axis=0 轴的最大值与最小值之差，即 7-1=6（当然 8-2=6,9-
# 3=6，第三行减去第一行的 ptp 差均为 6），ptp(a,1) 统计的是沿着 axis=1 轴的最大值与
# 最小值之差，即 3-1=2（当然 6-4=2, 9-7=2，即第三列与第一列的 ptp 差均为 2）

a = np.array([[1,2,3], [4,5,6], [7,8,9]])
print (np.ptp(a))
print (np.ptp(a,0))
print (np.ptp(a,1))
print ("==================================================================")

# 统计数组的百分位数 percentile()
a = np.array([[1,2,3], [4,5,6], [7,8,9]])
print (np.percentile(a, 50))
print (np.percentile(a, 50, axis=0))
print (np.percentile(a, 50, axis=1))
print ("==================================================================")

# 统计数组中的中位数 median()、平均数 mean()
a = np.array([[1,2,3], [4,5,6], [7,8,9]])
# 求中位数
print (np.median(a))
print (np.median(a, axis=0))
print (np.median(a, axis=1))
# 求平均数
print (np.mean(a))
print (np.mean(a, axis=0))
print (np.mean(a, axis=1))
print ("==================================================================")

# 统计数组中的加权平均值 average()
a = np.array([1,2,3,4])
wts = np.array([1,2,3,4])
print (np.average(a))
print (np.average(a,weights=wts))
print ("==================================================================")

#  统计数组中的标准差 std()、方差 var()
a = np.array([1,2,3,4])
print (np.std(a))
print (np.var(a))
print ("==================================================================")

# sort(a, axis=-1, kind=‘quicksort’, order=None)，默认情况下使用
# 的是快速排序；在 kind 里，可以指定 quicksort、mergesort、heapsort 分别表示快速排
# 序、合并排序、堆排序。同样 axis 默认是 -1，即沿着数组的最后一个轴进行排序，也可以
# 取不同的 axis 轴，或者 axis=None 代表采用扁平化的方式作为一个向量进行排序。另外
# order 字段，对于结构化的数组可以指定按照某个字段进行排序。
a = np.array([[4,3,2],[2,4,1]])
print (np.sort(a))
print (np.sort(a, axis=None))
print (np.sort(a, axis=0))
print (np.sort(a, axis=1))
